package modelo;

import org.jdom.Element;
import extras.xml.SerializableXML;
//import java.util.Observer;
import excepciones.XMLUnserializeException;

public class Juego implements SerializableXML<Element>{

//	protected ArrayList<Nivel> niveles;
	
	/**
	 * Carrera actual que se esta jugando. Si es null,
	 *  es que no se esta jugando ninguna carrera :)
	 */
	private Carrera carrera;
	
	private Jugador jugador;
	
//	private int numeroDeNivel;
	
	/**
	 * nivel del juego.
	 */
	private Nivel nivel;
	
	/** SINGLETON ***************************************/
	private static Juego INSTANCE;
	
	private Juego(){
		Auto auto=new Auto(new Win32(),new Mess10());
		this.jugador = new Jugador("jugador1",auto);
		this.nivel = new Nivel(1);
		this.carrera = new Carrera(jugador,nivel.getPista()); 
	}
	
	/*private synchronized static void crearinstancia() {
		if (INSTANCE == null) { 
	       INSTANCE = new Juego();
	    }
	}*/

	public static Juego getInstancia() {
	    //if (INSTANCE == null) 
		INSTANCE = new Juego();
		System.out.println("llegue");
	    return INSTANCE;
	}
	/****************************************************/
	

	
	/**
	 * Se crea el juego.
	 */
	public void iniciar(){
		if ((this.jugador != null) && (this.nivel != null))
			this.carrera = new Carrera(this.jugador, this.nivel.getPista());
	}

	public Jugador getJugador(){
		return this.jugador;
	}
	
	/**
	 * Setea el jugador
	 */
	public void setJugador(Jugador jugador) {
		this.jugador = jugador;
	}
	
	/**
	 * Setea el nivel
	 */
	public void setnivel(int numeroDeNivel) {
		this.nivel = new Nivel(numeroDeNivel);
	}
	
	/**
	 * Carga el juego definido en el elemento xml recibido como parametro.
	 * Si la instancia de juego ya habia sido creada, se reemplaza por
	 * la nueva que corresponde al juego guardado.
	 * @param xmlElement elemento xml que representa al juego
	 * @throws XMLUnserializeException si alguno de los valores del elemento
	 * xml es invalido
	 */
	public void cargarJuego(Element xmlElement) throws XMLUnserializeException {
//		//instancia = new Juego(xmlElement);  //   <---- no se puede hacer esto en singleton!!
//		taller.cargarDesdeXML(xmlElement.getChild("taller"));
//		carrera.cargarDesdeXML(xmlElement.getChild("proxima_carrera"));
//		
//		//TODO: modularizar esta porquer�a. POnerlo como metodo en jugador o algo asi...
//		JugadorHumano jugadorHCargado = carrera.getJugadorHumano();
//		JugadorMaquina jugadorMCargado = carrera.getJugadorMaquina();
//		
//		jugadorHumano.setNombre(jugadorHCargado.getNombre());
//		jugadorHumano.setAuto(jugadorHCargado.getAuto());
//		jugadorHumano.setCapital(jugadorHCargado.getCapital());
//		jugadorHumano.setPuntuacion(jugadorHCargado.getPuntuacion());
//		jugadorHumano.setCarrerasGanadas(jugadorHCargado.getCarrerasGanadas());
//		jugadorHumano.setCarrerasCorridas(jugadorHCargado.getCarrerasCorridas());
//		
//		jugadorMaquina.setNombre(jugadorMCargado.getNombre());
//		jugadorMaquina.setAuto(jugadorMCargado.getAuto());
//		jugadorMaquina.setDificultad(jugadorMCargado.getDificultad());
	}
	
	/**
	 * Devuelve un elemento xml que representa al juego.
	 * @return elemento xml que representa al juego
	 */
	public Element toXML() {
		Element xmlElement = new Element("juego");
//		xmlElement.addContent(getCarrera().toXML().setName("proxima_carrera"));
		return xmlElement;
	}

	public Nivel getNivel(){
		return nivel;
	}

	public Carrera getCarrera() {
		return carrera;
	}
	
	/**
	 * Indica si se esta corriendo o no una carrera.
	 * @return  true si se esta corriendo una carrera y 
	 * false en caso contrario.
	 */
	public boolean corriendoCarrera(){
		return carrera != null;
	}
}